/**
*将字符串中的小写转为大写
*/
function upperCase(str) {
	str = str.toUpperCase();
	return str;
}

/**
*将字符串中的大写转为小写
*/
function lowerCase(str) {
	str = str.toLowerCase();
	return str;
}

String.prototype.equals=function(b){return this==b;}   
/**
* 
* 去除多余空格函数
* trim:去除两边空格 lTrim:去除左空格 rTrim: 去除右空格
* 用法：
*     var str = "  hello ";
*     str = str.trim();
*/
String.prototype.trim11 = function()
{
    return this.replace(/(^[\\s]*)|([\\s]*$)/g,"");
}

String.prototype.trim = function() 
{ 
	return this.replace(/(^\s*)|(\s*$)/g, ""); 
}  

String.prototype.LTrim = function() {
	 return this.replace(/(^\s*)/g, ""); 
}  

String.prototype.RTrim = function() {
 	 return this.replace(/(\s*$)/g, ""); 
} 

/**
 * 按相应的格式转换日期，如：dateSome.format("yyyy-MM-dd");
 */
Date.prototype.format = function(format){
	var o = {
		"M+" : this.getMonth()+1, //month
		"d+" : this.getDate(),    //day
		"h+" : this.getHours(),   //hour
		"m+" : this.getMinutes(), //minute
		"s+" : this.getSeconds(), //second
		"q+" : Math.floor((this.getMonth()+3)/3),  //quarter
		"S" : this.getMilliseconds() //millisecond
	}
	if(/(y+)/.test(format)) format=format.replace(RegExp.$1,(this.getFullYear()+"").substr(4 - RegExp.$1.length));
	for(var k in o){
		if(new RegExp("("+ k +")").test(format)){
			format = format.replace(RegExp.$1,RegExp.$1.length==1 ? o[k] :("00"+ o[k]).substr((""+ o[k]).length));
		}
	}
	return format;
}

/* 判断某个对象是否定义，即判断是否正确地取得了某个控件。 */
function isNullOrUndefined(argControl){
	return ((typeof(argControl)=="undefined")||(argControl==null));
}

/* 
 * 判断是否为空白的字符串，其中包括中文字符的全角空白
 */
function isBlankStr(argStr){
	if(isNullOrUndefined(argStr)){
		return true;
	}
	else{
		var blankReg=/^[\s　]*$/;
		return blankReg.test(argStr);
	}
}

/**
 * 字符串转成日期类型
 * 格式 MM/dd/YYYY YYYY/MM/dd YYYY-MM-dd
 */
function parseStrToDate(DateStr){
	var converted = Date.parse(DateStr);
	var myDate = new Date(converted);
	if (isNaN(myDate)){
		//var delimChar = DateStr.indexOf('/')!=-1?'/':'-';
		var arys= DateStr.split('-');
		myDate = new Date(arys[0],--arys[1],arys[2]);
	}
	return myDate;
}


function checkEmail(strEmail){
    var myReg = /^[_a-z0-9\.]+@([_a-z0-9]+\.)+[a-z0-9]{2,3}$/;
	return myReg.test(strEmail);
}

function checkPassword(s){
    var patn = /.{6,15}/;
	//var patn = /(?=^.{6,16}$)(?=(.*\d){1,})(?=(.*\W){1,})(?=(.*[a-zA-Z]){1,}).*/;
	return patn.test(s);
}

function checkMobile(s){
	var patrn=/^13\d{9}$/;
	return patrn.test(s);
}

function checkTel(s){
	 var patrn=/^(\(\d{3,4}\)|\d{3,4}-)?\d{7,8}$/;
	return patrn.test(s);
}
		
function checkPostalCode(s){
	var patrn=/^[1-9]\d{5}$/;
	return patrn.test(s);
}	
	
function checkNumber(s){
	var patrn=/^[-\+]?\d+$/;
	return patrn.test(s);
}
	
function checkURL(s){
    var patrn=/^[a-zA-z]+:\/\/[^\s]*$/;
	return patrn.test(s);
}
function ifShorterThan(sArg,iLength){
	return sArg.length < iLength;
}


function $(strObjId){
	return document.getElementById(strObjId);
}

function isDate(s){
	var patrn=/^(19|20)\d{2}-(0?\d|1[012])-(0?\d|[12]\d|3[01])$/; 
	return patrn.test(s);

}

function isDigital(s){
	var patrn=/^(-|\+)?\d+(\.\d+)?$/;
	return patrn.test(s);
}

/*
用途：检查输入字符串是否符合金额格式
格式定义为带小数的正数，小数点后最多三位
输入：
s：字符串
返回：
如果通过验证返回true,否则返回false

*/
function isMoney( s ){
	var regu = "^[0-9]+[\.][0-9]{2,3}$";
	var re = new RegExp(regu);
	return re.test(s); 
}
/**
 * 通过iframe的Id取得该iframe的窗口对象
 */
function getIframeWindow(strFrameId){
	var objIframeWindow=null;
	if(document.all){
		objIframeWindow=document.frames(strFrameId);
	}
	else{
		objIframeWindow=$(strFrameId).contentWindow;
	}
	return objIframeWindow;
}

/**
 * 选择日期的函数，显示一个可自定义的日历小窗口。
 */
function chooseDay(objClicked,strIframeId,strInputId){
	document.onclick=function(){hideCalendar(strIframeId)};
	var objIframeCalendar=$(strIframeId);
	var objInput=$(strInputId);
//	objIframeCalendar.style.left=objClicked.offsetLeft+"px";
//	objIframeCalendar.style.top=(objClicked.offsetTop+objClicked.offsetHeight)+"px";
	var calendarPos = getPosition(objClicked);
	objIframeCalendar.style.left=calendarPos.x+"px";
	objIframeCalendar.style.top=(calendarPos.y+objClicked.offsetHeight)+"px";
	objIframeCalendar.style.display="block";
	var dateTheday=(isBlankStr(objInput.value)||isNaN(Date.parse(objInput.value)))?new Date():new Date(objInput.value);
	getIframeWindow(strIframeId).initCalendar(dateTheday.getFullYear(),dateTheday.getMonth(),strInputId,strIframeId);
}

/**
 * 隐藏日历小窗口的方法。
 */
function hideCalendar(strIframeId){
	$(strIframeId).style.display="none";
}

/**
 * 检查是否合理的日期。（供继承后进行自定义规则）
 * @param dateArg 传入的日期，即日历上的每一天。
 * @param strInputId 针对的表单某域，以区分不同的域，可能有不同的规则。
 * @see 例如：此段表示如果大于今天，则日历上的这些日期将失效，无法点击，仅允许点今天以前的日子。
 * if(strInputId=="inputSomeDay"&&dateArg>new Date()){
 * 	 return false;
 * }
 */
function validateDay(dateArg,strInputId){
	return true;
}

/**
 * 添加验证方法
 * @param objEmailInput 表单中需要验证的文本框对象
 * @param strMessageContainerId 显示提示的Div容器Id ，如果为空，则认为是以alert方式提示。
 * @param strMessage 验证不通过时显示的信息。
 * @see: 详细用法可以查看：/goldenfleece/console/test/test_form.html
 */
function addFieldCheck(strFieldId,strMessageContainerId,strErrorMessage,strSuccessMessage,strValideType){
	var objFieldChecked=$(strFieldId);
	var blnValide=false;
	if(!isBlankStr(strMessageContainerId)){
		var objMessageContainer=$(strMessageContainerId);
		var strOriginalClass=objMessageContainer.className;
		var strOriginalMessage=objMessageContainer.innerHTML;
		objFieldChecked.onfocus=function(){
			objMessageContainer.innerHTML=strOriginalMessage;
			objMessageContainer.className=strOriginalClass;
			blnValide=valideField(strFieldId, strValideType);
			doFocusOthers(blnValide, strFieldId, strMessageContainerId);
		}
	}
	objFieldChecked.onblur=function(){
		blnValide=valideField(strFieldId, strValideType);
		showValideMessage(blnValide, strMessageContainerId, strErrorMessage, strSuccessMessage);
		doBlueOthers(blnValide, strFieldId, strMessageContainerId);
	}
}

/**
 * 验证之外还想执行的方法，此处设定一个空的方法，在具体页面上需要时继承。
 */
function doFocusOthers(blnValide, strFieldId, strMessageContainerId){
	
}

function doBlueOthers(blnValide, strFieldId, strMessageContainerId){
	
}

/**
 * 将所有验证写在此方法里
 * @param strField 表单需要验证的域ID
 * @param strValideType 要验证的类别
 * @return 返回是否通过某验证
 */
function valideField(strField,strValideType){
	var objFieldChecked=$(strField);
	var returnValue = false;
	switch(strValideType){
		case "notempty" :
			returnValue=!isBlankStr(objFieldChecked.value);
			break;
		case "email" :
			returnValue=checkEmail(objFieldChecked.value);
			break;
		case "password" :
		    returnValue=checkPassword(objFieldChecked.value);
			break;
		case "mobile" :
		    returnValue=checkMobile(objFieldChecked.value);
			break;
		case "tel" :
		    returnValue=checkTel(objFieldChecked.value);
			break;
		case "number" :
			returnValue=checkNumber(objFieldChecked.value);
			break;
		case "money" :
			returnValue=isMoney(objFieldChecked.value);
			break;
		case "shorter255" :
			returnValue=ifShorterThan(objFieldChecked.value,255);
			break;
		case "customCheck" :
			//此处示意对某个域的有效性验证可以通过几个基础方法来叠加。
			returnValue=(checkEmail(objField.value)&&checkNumber(objField.value))||checkLength(objField.value,10);
			break;
		case "date" :
		    returnValue=isDate(objFieldChecked.value);
		    break;
		case "digital" :
			returnValue=isDigital(objFieldChecked.value);
			break;    
		default :
			break;
	}
	return returnValue;
}

/* 封装的验证Alert方法 */
function valideFieldAlert(strField,strValideType,strErrorMessage){
	var blnValided=valideField(strField,strValideType);
	if(!blnValided){
		alert(strErrorMessage);
		$(strField).focus();
	}
	return blnValided;
}

function showValideMessage(argBlnValide, strMessage, strError, strSuccess){
	var argBlnAlert=false;			// 是否传入了提示错误的容器ID，如果没有，则以alert方式提示。
	var strERRORCLASSNAME="divErrorMessage";
	if(isBlankStr(strMessage)){
		argBlnAlert = true;
	}
	else{
		var objMessageContainer=$(strMessage);
		var strOriginalClass=objMessageContainer.className;
	}
	if(argBlnAlert){
		if(argBlnValide){
			// 检验正确，不做任何事
		}
		else{
			alert(strError);
		}
	}
	else{
		if(argBlnValide){
			objMessageContainer.innerHTML=strSuccess;
			objMessageContainer.className=strOriginalClass;
		}
		else{
			objMessageContainer.innerHTML=strError;
			objMessageContainer.className=strERRORCLASSNAME;
		}
	}
}


/* 重新改变IFrame的大小 */
function resizeIframe(thisIframe){
	if(window.XMLHttpRequest){
		//Mozilla 浏览器
		thisIframe.style.height=thisIframe.contentDocument.documentElement.scrollHeight+'px';
	}
	else{
		// IE浏览器
		thisIframe.height=document.frames(thisIframe.name).document.body.scrollHeight+'px';
	}
}

/* 取得某ID对象的样式对象 */
function getStyle(d){var t=$(d);if (t){return t.style;}else{return null;}}

/* 取得d对象的样式中的a属性对象 */
function getStyleItem(d,a){
    if (d.currentStyle){
      var curVal=d.currentStyle[a];
    }
    else{
      var curVal=document.defaultView.getComputedStyle(d, null)[a];
    }
    return curVal;
}

/* 加载XML的通用方法 */
function createXMLDom(){
	if (window.ActiveXObject)
		var xmldoc=new ActiveXObject("Microsoft.XMLDOM");
	else 
		if (document.implementation&&document.implementation.createDocument)
			var xmldoc=document.implementation.createDocument("","doc",null);
	xmldoc.async = false;
	//为了和FireFox一至，这里不能改为False;
	xmldoc.preserveWhiteSpace=true;
	return xmldoc;
}

function createXMLHttp(){
	var xmlHttp;
	if (window.ActiveXObject){
		xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
	}else{
		xmlHttp=new XMLHttpRequest();
	}
	return xmlHttp;
}


function loadXmlFile(sXmlFile){
	var xmlDom=createXMLDom();
	try{
		xmlDom.load(sXmlFile);
	}catch(e){
		var xmlHttp=createXMLHttp();
		xmlHttp.onreadystatechange = function(){
			if(xmlHttp.readyState == 4){
				xmlDom=xmlHttp.responseXML;
			}else{
				//window.state="XML文件加载中...";
			}
		}		
		xmlHttp.open("GET",sXmlFile,false);
		xmlHttp.send(null);
	}
	return xmlDom;
}


/* 取得对象绝对位置的方法 */
function getPosition(e){      
    var left = 0;
    var top  = 0;
    while (e.offsetParent){
        left += e.offsetLeft;
        top  += e.offsetTop;
        e     = e.offsetParent;
    }

    left += e.offsetLeft;
    top  += e.offsetTop;

    return {x:left, y:top};

}

/* 取得鼠标位置的方法 */
function mouseCoords(ev){       
    if(ev.pageX || ev.pageY){
        return {x:ev.pageX, y:ev.pageY};
    }
    return {
        x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
        y:ev.clientY + document.body.scrollTop  - document.body.clientTop
    };
}

/* 取得鼠标相对被点击对象的位置的方法 */
function getMouseOffset(target, ev){
    ev = ev || window.event;

    var elementPos    = getPosition(target);
    var mousePos  = mouseCoords(ev);
    return {x:mousePos.x - elementPos.x, y:mousePos.y - elementPos.y};
}

/* 取得浏览器类型的方法 */
function getBrowserType()
{
	var browser = '';
	var agentInfo = navigator.userAgent.toLowerCase();
	if (agentInfo.indexOf("msie") > -1) {
		var re = new RegExp("msie\\s?([\\d\\.]+)","ig");
		var arr = re.exec(agentInfo);
		if (parseInt(RegExp.$1) >= 5.5) {
			browser = 'IE';
		}
	} else if (agentInfo.indexOf("firefox") > -1) {
		browser = 'FF';
	} else if (agentInfo.indexOf("netscape") > -1) {
		var temp1 = agentInfo.split(' ');
		var temp2 = temp1[temp1.length-1].split('/');
		if (parseInt(temp2[1]) >= 7) {
			browser = 'NS';
		}
	} else if (agentInfo.indexOf("gecko") > -1) {
		browser = 'ML';
	} else if (agentInfo.indexOf("opera") > -1) {
		var temp1 = agentInfo.split(' ');
		var temp2 = temp1[0].split('/');
		if (parseInt(temp2[1]) >= 9) {
			browser = 'OPERA';
		}
	}
	return browser;
}

/* 取得文件后缀名的方法 */
function getFileExt(fileName)
{
	var temp = fileName.split(".");
	var len = temp.length;
	var fileExt = temp[len-1].toLowerCase();
	return fileExt;
}

/**
 * 取得文件名的方法
 * @param file 各种各样完整的文件名
 * @param separator 分隔符，如“\\”或“/”
 */
function getFileName(file, separator)
{
	var temp = file.split(separator);
	var len = temp.length;
	var fileName = temp[len-1];
	return fileName;
}

/**
 * marquee移动显示内容的方法
 * @param strOverAll 总容器ID
 * @param strOriginal 原始对象ID
 * @param strClone 复制的对象ID
 * @param intSpeed 移动的速度
 * @param intDirection 移动的方向 1 为上，2 为右，3 为下， 4 为左。
 * @param intPixs 移动的像素数
 */
function marqueeElement(strOverAll,strOriginal,strClone,intDirection,intPixs){
	var objOverAll=$(strOverAll);
	var objOriginal=$(strOriginal);
	var objClone=$(strClone);
	objClone.innerHTML=objOriginal.innerHTML;
	switch(intDirection){
		case 1:
			if(objOverAll.scrollTop < objOriginal.offsetHeight){
				objOverAll.scrollTop=objOverAll.scrollTop+intPixs;
			}
			else{
				objOverAll.scrollTop=0;
			}
			break;
		case 2:
			if(objOverAll.scrollLeft>0){
				objOverAll.scrollLeft=objOverAll.scrollLeft-intPixs;
			}
			else{
				objOverAll.scrollLeft=objOriginal.offsetWidth;
			}
			break;
		case 3:
			if(objOverAll.scrollTop>0){
				objOverAll.scrollTop=objOverAll.scrollTop-intPixs;
			}
			else{
				objOverAll.scrollTop=objOriginal.offsetHeight;
			}
			break;
		case 4:
			if(objOverAll.scrollLeft < objOriginal.offsetWidth){
				objOverAll.scrollLeft=objOverAll.scrollLeft+intPixs;
			}
			else{
				objOverAll.scrollLeft=0;
			}
			break;
		default:
			break;
	}
}

/**
 * @marquee移动显示内容的方法
 * @param strOverAll 总容器ID
 * @param strOriginal 原始对象ID
 * @param strClone 复制的对象ID
 * @param objInterval 事件对象变量
 * @param intDirection 移动的方向 1 为上，2 为右，3 为下， 4 为左。
 * @param intSpeed 移动的速度
 * @param intPixs 移动的像素数
 * 注：总容器需要定义OVERFLOW: hidden; WIDTH: 502px;（左右跑） height: 100px;（上下跑）
 *     总容器的宽/高度必须小于内容的宽/高，内容中必须有一个复制的容器与原内容在同一个表格中，左右跑则两个内容在一行，
 *     上下跑则两个内容在一列。
 */
function intervalMarquee(strOverAll,strOriginal,strClone,objInterval,intDirection,intSpeed,intPixs){
	objInterval=setInterval('marqueeElement("'+strOverAll+'","'+strOriginal+'","'+strClone+'",'+intDirection+','+intPixs+')',intSpeed);
	var objOverAll=$(strOverAll);
	objOverAll.onmouseover=function(){
		clearInterval(objInterval);
	}
	objOverAll.onmouseout=function(){
		objInterval=setInterval('marqueeElement("'+strOverAll+'","'+strOriginal+'","'+strClone+'",'+intDirection+','+intPixs+')',intSpeed);
	}
}


/**
 *
 * Cookie操作方法
 */
function getCookie (name) {
	var CookieFound = false;
	var start = 0;
	var end = 0;
	var CookieString = document.cookie;
	// alert(CookieString);
	var i = 0;
	
	while (i <= CookieString.length) {
		start = i ;
		end = start + name.length;
		if (CookieString.substring(start, end) == name){
			CookieFound = true;
			break;
		}
		i++;
	}
	
	if (CookieFound){
		start = end + 1;
		end = CookieString.indexOf(";",start);
		if (end < start)
			end = CookieString.length;
		return unescape(CookieString.substring(start, end));
	}
	return "";
}

function deleteCookie(name){
	var expires = new Date();
	expires.setTime (expires.getTime() - 1);
	setCookie( name , "", expires,null,null,false);
}


function setCookie(name, value){
	var expdate = new Date();
	var argv = setCookie.arguments;
	var argc = setCookie.arguments.length;
	var expires = (argc > 2) ? argv[2] : null;
	var path = (argc > 3) ? argv[3] : null;
	var domain = (argc > 4) ? argv[4] : null;
	var secure = (argc > 5) ? argv[5] : false;
	if(expires!=null) expdate.setTime(expdate.getTime() + ( expires * 1000 ));
	document.cookie = name + "=" + escape (value) +((expires == null) ? "" : ("; expires="+ expdate.toGMTString()))
	+((path == null) ? "" : ("; path=" + path)) +((domain == null) ? "" : ("; domain=" + domain))
	+((secure == true) ? "; secure" : "");
}



/** ===================================全局执行的脚本部分======================**/

/* 取得浏览器的类型，如："IE" */
var sBrowserType=getBrowserType();

/* 此部分为非IE的浏览器加上loadXML、selectNodes、selectSingleNode 方法 */
if(!document.all){
    XMLDocument.prototype.loadXML = function(xmlString)
    {
        var childNodes = this.childNodes;
        for (var i = childNodes.length - 1; i >= 0; i--)
            this.removeChild(childNodes[i]);

        var dp = new DOMParser();
        var newDOM = dp.parseFromString(xmlString, "text/xml");
        var newElt = this.importNode(newDOM.documentElement, true);
        this.appendChild(newElt);
    };

    // check for XPath implementation
    if( document.implementation.hasFeature("XPath", "3.0") )
    {
       // prototying the XMLDocument
       XMLDocument.prototype.selectNodes = function(cXPathString, xNode)
       {
          if( !xNode ) { xNode = this; } 
          var oNSResolver = this.createNSResolver(this.documentElement)
          var aItems = this.evaluate(cXPathString, xNode, oNSResolver, 
                       XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
          var aResult = [];
          for( var i = 0; i < aItems.snapshotLength; i++)
          {
             aResult[i] =  aItems.snapshotItem(i);
          }
          return aResult;
       }

       // prototying the Element
       Element.prototype.selectNodes = function(cXPathString)
       {
          if(this.ownerDocument.selectNodes)
          {
             return this.ownerDocument.selectNodes(cXPathString, this);
          }
          else{throw "For XML Elements Only";}
       }
    }

    // check for XPath implementation
    if( document.implementation.hasFeature("XPath", "3.0") )
    {
       // prototying the XMLDocument
       XMLDocument.prototype.selectSingleNode = function(cXPathString, xNode)
       {
          if( !xNode ) { xNode = this; } 
          var xItems = this.selectNodes(cXPathString, xNode);
          if( xItems.length > 0 )
          {
             return xItems[0];
          }
          else
          {
             return null;
          }
       }
       
       // prototying the Element
       Element.prototype.selectSingleNode = function(cXPathString)
       {    
          if(this.ownerDocument.selectSingleNode)
          {
             return this.ownerDocument.selectSingleNode(cXPathString, this);
          }
          else{throw "For XML Elements Only";}
       }
    }
}


/**
 * 令所有class含有"dragclass"的容器均可被拖动。
 */
if(document.getElementById){
  (
    function(){
      if (window.opera){ document.write("<input type='hidden' id='Q' value=' '>"); }
    
      var n = 500;
      var dragok = false;
      var y,x,d,dy,dx;
      
      function move(e)
      {
        if (!e) e = window.event;
        if (dragok){
          d.style.left = dx + e.clientX - x + "px";
          d.style.top  = dy + e.clientY - y + "px";
          return false;
        }
      }
      
      function down(e){
        if (!e) e = window.event;
        var temp = (typeof e.target != "undefined")?e.target:e.srcElement;
        if (temp.tagName != "HTML"|"BODY" && temp.className.indexOf("dragclass")<0){
          temp = (typeof temp.parentNode != "undefined")?temp.parentNode:temp.parentElement;
        }
        if('TR'==temp.tagName){
          temp = (typeof temp.parentNode != "undefined")?temp.parentNode:temp.parentElement;
          temp = (typeof temp.parentNode != "undefined")?temp.parentNode:temp.parentElement;
          temp = (typeof temp.parentNode != "undefined")?temp.parentNode:temp.parentElement;
        }
      
        if (temp.className.indexOf("dragclass")>=0){
          if (window.opera){ document.getElementById("Q").focus(); }
          dragok = true;
          temp.style.zIndex = n++;
          d = temp;
          dx = parseInt(getStyleItem(temp,"left"))|0;
          dy = parseInt(getStyleItem(temp,"top"))|0;
          x = e.clientX;
          y = e.clientY;
          document.onmousemove = move;
          return false;
        }
      }
      
      function up(){
        dragok = false;
        document.onmousemove = null;
      }
      
      document.onmousedown = down;
      document.onmouseup = up;
    
    }
  )();
}

document.getElementsByClassName = function(clsName){
    var retVal = new Array();
    var elements = document.getElementsByTagName("*");
    for(var i = 0;i < elements.length;i++){
        if(elements[i].className.indexOf(" ") >= 0){
            var classes = elements[i].className.split(" ");
            for(var j = 0;j < classes.length;j++){
                if(classes[j] == clsName)
                    retVal.push(elements[i]);
            }
        }
        else if(elements[i].className == clsName)
            retVal.push(elements[i]);
    }
    return retVal;
}

/* 传入标签ID，可以切换该对象的显示与隐藏。 */
function switchHideShow(sTagId){
	var oTag=document.getElementById(sTagId);
	oTag.style.display=(oTag.style.display=='none'||oTag.style.display=='')?'block':'none';
}
/* 将某元素设置成页面的调度。 */
function setToBodyHeight(sTagId){
	var oTag=document.getElementById(sTagId);
	oTag.style.height=document.documentElement.clientHeight+"px";
}